package com.qf.aop2204.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//@Aspect//该注解代表当前类是一个切面类
//@Component
public class TestAspect {
    //切点表达式的注解
    //命中的方法集合为com.qf.aop2204.controller包下及其子包下的所有类的所有方法都被该切点表达式命中
    @Pointcut("execution(* com.qf.aop2204.controller..*.*(..))")
    public void mypointcut01(){

    }
    @Before("mypointcut01()")
    public void before(){
        System.out.println("==================");
    }
    @After("mypointcut01()")
    public void after(){
        System.out.println("----------------");
    }

    /**
     * 环绕通知需要有返回值
     * 环绕通知需要接收一个特定类型的参数
     * 该参数的作用可以让目标方法继续执行
     * @param pjp
     * @return
     */
    @Around("mypointcut01()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("~~~~~~~~~~~~~~~~~");
        long start = System.currentTimeMillis();
        Object result = pjp.proceed();
        System.out.println("~~~~~~~~~~~~~~~~~");
        long end = System.currentTimeMillis();
        System.out.println("time used->"+(end-start));
        return result;
    }
}
